package dialogs.player;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableRowSorter;
//import javax.swing.text.ChangedCharSetException;
import javax.swing.RowFilter;

/**
 * 
 * GUI des Spielerdialogs
 * 
 */
@SuppressWarnings("serial")
public class PlayerView extends javax.swing.JPanel implements Observer {

	/**
	 * Referenz auf das Eingabemodell, dass angezeigt wird
	 */
	private PlayerInputModel inputModel;
	/**
	 * Referenz auf das TableModel, dass angezeigt wird
	 */
	private PlayerTableModel tableModel;

	/**
	 * Button fuer das Hinzufuegen von einem Spieler
	 */
	private javax.swing.JButton addButton;

	/**
	 * Button f�r das deactivieren von Spielern
	 */
	private javax.swing.JButton deactivateButton;
	/**
	 * Button f�r das ver�ndern von Spielern
	 */
	private javax.swing.JButton changeButton;

	/**
	 * Button zum laden von Spielerdaten in das Formular
	 */
	private javax.swing.JButton loadButton;

	/**
	 * Button zum umschalten der activ-Filterung
	 */
	private javax.swing.JButton toggleFilterButton;

	/**
	 * Eingabefelder fuer die Spielerdaten
	 */
	private JTextField firstNameTextField;
	private JTextField familyNameTextField;
	private JTextField dobTextField;
	private JTextField playsSinceTextField;
	/**
	 * sorter und filter f�r die Tabelle
	 */
	TableRowSorter<PlayerTableModel> sorter;
	RowFilter<Object, Object> rowFilter;
	/**
	 * Farbe fuer gueltige Felder
	 */
	private Color validColor = new Color(255, 255, 255);

	/**
	 * Farbe fuer ungueltige Felder
	 */
	private Color invalidColor = new Color(255, 0, 0);

	/**
	 * Tabellen-Widget fuer die Darstellung der vorhandenen Spieler
	 */
	private JTable playerTable;

	/**
	 * @param inputModel
	 *            Modell für die Eingabedaten für einen Spieler
	 * @param tableModel
	 *            Modell für die Daten, die in der Spielertabelle angezeigt
	 *            werden
	 */
	public PlayerView(PlayerInputModel inputModel, PlayerTableModel tableModel) {
		// Zuweisen der Models zu der View
		this.inputModel = inputModel;
		this.tableModel = tableModel;
		// Anmelden der View (also diesem Objekt selbst) bei dem Modell
		// die PlayerView implementiert das Observer-Interface und
		// wird von der Observablen (also dem Modell), bei Veraenderungen
		// des Modells benachrichtigt, indem in der PlayerView die Methode
		// update() aufgerufen wird (siehe unten)
		this.inputModel.addObserver(this);
		initComponents();
	}

	/**
	 * Initialisieren der GUI-Komponenten, wird im Konstruktor aufgerufen
	 */
	private void initComponents() {
		// Anlegen der Eingabefelder fuer Spielerdaten
		firstNameTextField = new JTextField();
		familyNameTextField = new JTextField();
		dobTextField = new JTextField();
		playsSinceTextField = new JTextField();

		// Anlegen des Buttons
		addButton = new javax.swing.JButton();
		addButton.setText("Spieler anlegen");
		addButton.setActionCommand("add");
		// changebutton anlegen
		changeButton = new javax.swing.JButton();
		changeButton.setText("Spieler bearbeiten");
		changeButton.setActionCommand("edit");
		// Anlegen des deletebuttons
		deactivateButton = new javax.swing.JButton();
		deactivateButton.setText("Spieler deactivieren");
		deactivateButton.setActionCommand("deactivate");

		loadButton = new javax.swing.JButton();
		loadButton.setText("Spieler laden");
		loadButton.setActionCommand("load");

		toggleFilterButton = new javax.swing.JButton();
		toggleFilterButton.setText("show deactiv. Players");
		toggleFilterButton.setActionCommand("togglefilter");

		// Anlegen eines Gridlayouts mit 2 Spalten und beliebig vielen
		// Zeilen
		GridLayout dataLayout = new GridLayout(0, 2);
		// Anlegen eines JPanel (Container fuer GUI-Elemente)
		JPanel dataPanel = new JPanel();
		// Gridlayout im JPanel setzen
		dataPanel.setLayout(dataLayout);
		// GUI-Komponenten in das Panel einfuegen
		dataPanel.add(new JLabel("Vorname:"));
		dataPanel.add(firstNameTextField);
		dataPanel.add(new JLabel("Nachname:"));
		dataPanel.add(familyNameTextField);
		dataPanel.add(new JLabel("Kickert seit:"));
		dataPanel.add(playsSinceTextField);
		dataPanel.add(new JLabel("Geburtsdatum:"));
		dataPanel.add(dobTextField);
		dataPanel.add(new JLabel(" "));
		dataPanel.add(addButton);
		dataPanel.add(new JLabel(" "));
		dataPanel.add(changeButton);
		dataPanel.add(new JLabel(" "));
		dataPanel.add(loadButton);
		dataPanel.add(new JLabel(" "));
		dataPanel.add(deactivateButton);
		dataPanel.add(new JLabel(" "));
		dataPanel.add(toggleFilterButton);
		dataPanel.add(new JSeparator());
		dataPanel.add(new JSeparator());

		// neue Tabelle mit Spielern anlegen, der Konstruktor bekommt ein
		// TableModel uebergeben, in diesem Fall das selbst implementierte
		// PlayerTableModel
		playerTable = new JTable(tableModel);
		// Tabellen-Scrollbereich definieren
		playerTable.setPreferredScrollableViewportSize(new Dimension(500, 80));
		playerTable.setFillsViewportHeight(true);
		playerTable.setRowHeight(18);
		// Auto-Sorter aktivieren, macht die Tabelle sortierbar
		// playerTable.setAutoCreateRowSorter(true);
		// experimentell
		sorter = new TableRowSorter<PlayerTableModel>(tableModel);
		playerTable.setRowSorter(sorter);
		rowFilter = new RowFilter<Object, Object>() {
			public boolean include(
					Entry<? extends Object, ? extends Object> entry) {
				if (entry.getValue(4).equals(true)) {
					return true;
				} else {
					return false;
				}
			}
		};
		sorter.setRowFilter(rowFilter);
		// Scrollbare Flaeche anlegen, mit der Tabelle als Inhalt
		JScrollPane scrollPane = new JScrollPane(playerTable);

		// in der PlayerView ein BorderLayout als Layoutmanager setzen
		this.setLayout(new BorderLayout());
		// Hinzufuegen des DatenPanels (mit den Eigabefeldern, und dem Button)
		this.add(dataPanel, BorderLayout.NORTH);
		// Hinzufuegen des scrollPane mit der Spieler-Tabelle
		this.add(scrollPane, BorderLayout.CENTER);

	}

	/**
	 * Update-Methode, wird von den Observablen aufgerufen, bei denen sich die
	 * View angemeldet hat, siehe Konstruktor
	 * 
	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
	 * 
	 * @param o
	 *            Observable, der informiert
	 * @param arg
	 *            beliebiges Object-Argument
	 */
	@Override
	public void update(Observable o, Object arg) {

		// Modell abfragen, ob der Vorname gueltig ist
		// dann dementsprechend Farbe des Eingabefeldes setzen
		if (inputModel.isFirstNameValid()) {
			firstNameTextField.setBackground(validColor);
		} else {
			firstNameTextField.setBackground(invalidColor);
		}

		// Modell abfragen, ob der Nachname gueltig ist
		// dann dementsprechend Farbe des Eingabefeldes setzen
		if (inputModel.isFamilyNameValid()) {
			familyNameTextField.setBackground(validColor);
		} else {
			familyNameTextField.setBackground(invalidColor);
		}

		// Model abfragen, ob die Jahreszahl fuer "spielt seit" gueltig ist
		// dann dementsprechend Farbe des Eingabefeldes setzen
		if (inputModel.isPlaysSinceValid()) {
			playsSinceTextField.setBackground(validColor);
		} else {
			playsSinceTextField.setBackground(invalidColor);
		}

		// Model abfragen, ob das Geburtsdatum gueltig ist
		// dann dementsprechend Farbe des Eingabefeldes setzen
		if (inputModel.isDateOfBirthValid()) {
			dobTextField.setBackground(validColor);
		} else {
			dobTextField.setBackground(invalidColor);
		}
	}

	/**
	 * Methode loescht alle Eintraege in den Eingabefeldern
	 */
	public void refresh() {
		firstNameTextField.setText("");
		familyNameTextField.setText("");
		playsSinceTextField.setText("");
		dobTextField.setText("");
	}

	/**
	 * Hinzufuegen von ActionListerner, diese werden informiert, wenn ein Event
	 * vom z.B. AddButton ausgeloest wird
	 * 
	 * @param al
	 *            ActionListener, der angmeldet wird
	 */
	public void addActionListener(ActionListener al) {
		addButton.addActionListener(al);
		changeButton.addActionListener(al);
		deactivateButton.addActionListener(al);
		loadButton.addActionListener(al);
		toggleFilterButton.addActionListener(al);
	}

	/**
	 * @return Rueckgabe des Vornamens
	 */
	public String getFirstNameText() {
		return firstNameTextField.getText();
	}

	/**
	 * @return Rueckgabe des Nachnamens
	 */
	public String getFamilyNameText() {
		return familyNameTextField.getText();
	}

	/**
	 * @return Rueckgabe des Jahres, seit dem der Spieler kickert
	 */
	public String getPlaysSinceText() {
		return playsSinceTextField.getText();
	}

	/**
	 * @return Rueckgabe des Geburtsdatums (date of birth)
	 */
	public String getDobText() {
		return dobTextField.getText();
	}

	/**
	 * @return Index im der Liste, des in der Tabelle ausgewaehlten Spielers
	 */
	public int getSelectedPlayerIndex() {
		if (playerTable.getSelectedRow() != -1)
			return playerTable.convertRowIndexToModel(playerTable
					.getSelectedRow());
		else
			return -1;
	}

	public void setFirstNameText(String text) {
		firstNameTextField.setText(text);
	}

	/**
	 * 
	 */
	public void setFamilyNameText(String text) {
		familyNameTextField.setText(text);
	}

	/**
	 * 
	 */
	public void setPlaysSinceText(String text) {
		playsSinceTextField.setText(text);
	}

	/**
	 * 
	 */
	public void setDobText(String text) {
		dobTextField.setText(text);
	}

	public void toogleFilter() {
		if (sorter.getRowFilter() == null) {
			sorter.setRowFilter(rowFilter);
			toggleFilterButton.setText("show deactiv. Players");
		} else {
			sorter.setRowFilter(null);
			toggleFilterButton.setText("hide deactiv. Players");
		}
	}

}
